#ifndef FILETOOL_H
#define FILETOOL_H

#include <QObject>
#include <functional>
#include <QSet>
#include <mutex>
#include "mytypes.h"

class FileTool final:public QObject
{
    Q_OBJECT
private:
    FileTool();
    static FileTool* _instance;

public:
    static const quint64 bkhash=131313 ;
    virtual ~FileTool();
    static FileTool* GetInstance();
    std::function<void()> GetToolFunction(Yzty::FileTypeLimit::Type type,int index);    //根据文件类型获取功能
    void SetFileCheckCondition(const Yzty::FileCheckCondition& conditon);               //设置文件检查条件
    void PerProcessionWord(const QMap<QString,int>& options);                           //预处理单词加快速度
    void SetOption(QString item,int value);                                             //设置选项信息

private:
    //功能的实现
    void File_KeyWord_Check_Doc(int index);          //解析Doc
    void File_KeyWord_Check_Xls(int index);          //解析Xls
    void File_KeyWord_Check_Ppt(int index);          //ppt解析
    void File_KeyWord_Check_Html(int index);         //解析Html
    void File_KeyWord_Check_Htm(int index);         //解析Htm
    void File_KeyWord_Check_Xml(int index);          //解析Xml
    void File_KeyWord_Check_Txt(int index);          //解析Txt
    void File_KeyWord_Check_Wps(int index);          //解析Wps
    void File_KeyWord_Check_Et(int index);          //解析Et
    void File_KeyWord_Check_Dps(int index);          //解析Dps
    void File_KeyWord_Check_Docx(int index);          //解析Docx
    void File_KeyWord_Check_Xlsx(int index);          //解析xlsx
    void File_KeyWord_Check_Pptx(int index);          //解析pptx
    void File_KeyWord_Check_Png(int index);           //解析png
    void File_KeyWord_Check_Jpg(int index);           //解析jpg
    void File_KeyWord_Check_Bmp(int index);           //解析bmp
    void File_KeyWord_Check_Pdf(int index);           //解析pdf
    void File_KeyWord_Check_Odt(int index);           //解析jpg
    void File_KeyWord_Check_Ods(int index);           //解析Ods
    void File_KeyWord_Check_Odp(int index);           //解析pdf
    void File_KeyWord_Check_Pps(int index);           //解析PPS
    void File_KeyWord_Check_Wpt(int index);           //解析WPT
    void File_KeyWord_Check_Rtf(int index);          //解析Rtf
    void File_KeyWord_Check_Jpeg(int index);           //解析JPEG
    void File_KeyWord_Check_Mht(int index);           //解析MHT
    void File_KeyWord_Check_Dot(int index);           //解析DOT
    void File_KeyWord_Check_Dotx(int index);           //解析DOT
    void ignoreSpace(QString &filename);
    bool File_Check_SecretFlag(QString& text);
    //文件检查统一接口
    QVector<Yzty::FileKeyWordPos> File_KeyWord_Check_Interface(const QString& filename,const QMap<QString,int>& options,QString &subStrings);
    //需要返回一个KeyWordPos数组

    // BKDR Hash Function
    QVector<Yzty::FileKeyWordPos> BkdrHashFunction_CheckMenthod(const QString& text);

    void removecache();                 //清楚缓存
    void Absfilenubers();
    QString replacestr(QString &&s);
private:
    Yzty::FileCheckCondition _condition;      //检查条件

    QSet<int>                            _lengths;               //关键字可能出现的长度
    QMap<quint64,QVector<QPair<Yzty::WordLibCode,int>>> _hash_word;    //字符串哈希预处理

    QMap<QString,int>   options;         //检查选项

    std::atomic<int>    _cnts;          //文件计数器
};


#endif // FILETOOL_H
